
typedef void (*GPSmsg_listener)( void );

namespace ModuleData
{

  // 预定的消息，上层可对此些消息感兴趣
  enum {
    GPS_RECEIVER_DATA_RECEIVE,	// 接收到数据，此时get_last**可得到最新数据
    GPS_RECEIVER_ACTIVED_DATA,	// 数据已分析，证实是有效数据


    GPS_RECEIVER_MSG_MAX	// 末尾的常量，用于定义监听队列长度
  };

  // 定义回调函数的原型
  class GPSreceiver  
  {
  public:

    GPSreceiver( void ) { init(); }

    // init是(重新)初始化所有的成员变量
    void                           init( void );
    // monitor是开始对设备进行监视
    void                           monitor( void );

    // 加入或者删除消息监听器
    void                           add_listener( int msg_id, GPSmsg_listener _listener );
    void                           rmv_listener( int msg_id, GPSmsg_listener _listener );

    // 获取设备的最新数据
    const GPSdata&                 get_last_data( void ) { return *last_get; }
    const GPSdata&                 get_last_actived_data( void ) { return *last_actived; }

  private:
    // 使用两个GPSdata，交替存储数据，如果数据是可用的则将后面两个指针设置到相应对象上
    GPSdata                        data[2];
    GPSdata                        *last_get, *last_actived;

    std::set< GPSmsg_listener >    msg_listeners[ GPS_RECEIVER_MSG_MAX ];

    GPSsplitter                    _paser;
    friend  int                    device_monitor( GPSreceiver * );
  }; 

}

